﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
  public  class InformeAdapter
    {
        

        BDRinconLuzEntities contexto;

        public InformeAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public InformeAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

        public InformeAlumno ObtenerInformeInscripcionAlumno(Guid legajoAlumno, Guid idCicloLectivo)
        {

            InformeAlumno informe;

            var inscripcion = (from v in contexto.InscripcionCicloLectivo.Include("Turno").Include("CicloLectivo")
                           where v.Turno.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                           v.Alumno.LegajoAlumno == legajoAlumno &&
                           v.Eliminada != true
                           select v).First();

            var alumno = (from v in contexto.Alumno.Include("AlergiasAlumno").Include("AlumnoAlimentacion").Include("AlumnoFamiliares").Include("EnfermedadesAlumno").Include("AlumnoInstitucion").Include("AlumnoNacimiento").Include("AlumnoSalud").Include("AlumnoVidaFamiliar").Include("InscripcionesCiclosLectivos").Include("HermanosAlumno").Include("AlumnoHabitos").Include("AlumnoVidaSocial")
                           where v.LegajoAlumno == legajoAlumno &&
                                 v.Eliminado != true
                           select v).First();


            alumno.PadreTutor = new Familiar();
            alumno.MadreTutora = new Familiar();

            alumno.Urgencia1 = new Familiar();
            alumno.Urgencia2 = new Familiar();

            alumno.Autorizado1 = new Familiar();
            alumno.Autorizado2 = new Familiar();

            var existeMadre = (from v in alumno.AlumnoFamiliares
                               where v.IdParentesco == new ParentescoAdapter().ObtenerIdMadreTutora()
                               select v.LegajoFamiliar).Any();

            if (existeMadre)
            {
                var idMadre = (from v in alumno.AlumnoFamiliares
                               where v.IdParentesco == new ParentescoAdapter().ObtenerIdMadreTutora()
                               select v.LegajoFamiliar).First();

                alumno.MadreTutora = new FamiliarAlumnoAdapter().ObtenerEntidad(idMadre);
                             
            }


            var existePadre = (from v in alumno.AlumnoFamiliares
                               where v.IdParentesco == new ParentescoAdapter().ObtenerIdPadreTutor()
                               select v.LegajoFamiliar).Any();

            if (existePadre)
            {
                var idPadre = (from v in alumno.AlumnoFamiliares
                               where v.IdParentesco == new ParentescoAdapter().ObtenerIdPadreTutor()
                               select v.LegajoFamiliar).First();

                alumno.PadreTutor = new FamiliarAlumnoAdapter().ObtenerEntidad(idPadre);

            }


            var cantidadUrgencia = (from v in alumno.AlumnoFamiliares
                                    where v.Urgencia == true
                                    select v.LegajoFamiliar).ToList();

            if (cantidadUrgencia.Count > 0)
            {
                if (cantidadUrgencia.Count == 1)
                {
                    alumno.Urgencia1 = new FamiliarAlumnoAdapter().ObtenerEntidad(cantidadUrgencia[0]);
                 
                }


                if (cantidadUrgencia.Count == 2)
                {
                    alumno.Urgencia1 = new FamiliarAlumnoAdapter().ObtenerEntidad(cantidadUrgencia[0]);
                    alumno.Urgencia2 = new FamiliarAlumnoAdapter().ObtenerEntidad(cantidadUrgencia[1]);


                }


            }

           return informe = new InformeAlumno(alumno, inscripcion);

           
        }


        public InformeGastos ObtenerTotalCuotas(string mes, int año)
        {

            if (mes != "- Todos -")
            {

                var ExistenPagos = (from v in contexto.CuotaAlumno
                                    where v.MesPago == mes &&
                                         v.AñoPago == año &&
                                         v.Eliminada != true
                                    select v).Any();


                if (ExistenPagos)
                {
                    var MontoTotal = (from v in contexto.CuotaAlumno
                                      where v.MesPago == mes &&
                                           v.AñoPago == año &&
                                           v.Eliminada != true
                                      select v.ImporteCuota).Sum();

                    InformeGastos cuotas = new InformeGastos("Ingresos por pagos de cuotas", MontoTotal);
                    return cuotas;
                }
                else
                {
                    InformeGastos cuotas = new InformeGastos("Ingresos por pagos de cuotas", 0);
                    return cuotas;
                }
            }
            else
            {

                var ExistenPagos = (from v in contexto.CuotaAlumno
                                    where v.AñoPago == año &&
                                          v.Eliminada != true
                                    select v).Any();


                if (ExistenPagos)
                {
                    var MontoTotal = (from v in contexto.CuotaAlumno
                                      where v.AñoPago == año &&
                                            v.Eliminada != true
                                      select v.ImporteCuota).Sum();

                    InformeGastos cuotas = new InformeGastos("Ingresos por pagos de cuotas", MontoTotal);
                    return cuotas;
                }
                else
                {
                    InformeGastos cuotas = new InformeGastos("Ingresos por pagos de cuotas", 0);
                    return cuotas;
                }


            }

        }


        public InformeGastos ObtenerTotalInscripciones(string mes, Guid idCicloLectivo)
        {

            if (mes != "- Todos -")
            {

                var ExistenPagos = (from v in contexto.PagoInscripcion
                                    where v.MesDePago == mes &&
                                         v.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                                         v.Eliminada != true
                                    select v).Any();


                if (ExistenPagos)
                {
                    var MontoTotal = (from v in contexto.PagoInscripcion
                                      where v.MesDePago == mes &&
                                           v.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                                           v.Eliminada != true
                                      select v.ImporteInscripcion).Sum();

                    InformeGastos inscripciones = new InformeGastos("Ingresos por pagos de inscripciones", MontoTotal);
                    return inscripciones;
                }
                else
                {
                    InformeGastos inscripciones = new InformeGastos("Ingresos por pagos de inscripciones", 0);
                    return inscripciones;
                }
            }
            else
            {

                var ExistenPagos = (from v in contexto.PagoInscripcion
                                    where v.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                                          v.Eliminada != true
                                    select v).Any();


                if (ExistenPagos)
                {
                    var MontoTotal = (from v in contexto.PagoInscripcion
                                      where v.CicloLectivo.IdCicloLectivo == idCicloLectivo &&
                                            v.Eliminada != true
                                      select v.ImporteInscripcion).Sum();

                    InformeGastos inscripciones = new InformeGastos("Ingresos por pagos de inscripciones", MontoTotal);
                    return inscripciones;
                }
                else
                {
                    InformeGastos inscripciones = new InformeGastos("Ingresos por pagos de inscripciones", 0);
                    return inscripciones;
                }


            }

        }


        public List<InformeGastos> ObtenerTotalGastos(string mes, int año)
        {

            if (mes != "- Todos -")
            {
                int numeroMes = ObtenerNumeroMes(mes);

                List<InformeGastos> ListaGastos = new List<InformeGastos>();

                var ExistenGastos = (from v in contexto.Gasto
                                     where v.FechaPago.Month == numeroMes &&
                                         v.FechaPago.Year == año &&
                                         v.Eliminado != true
                                     select v).Any();

                if (ExistenGastos)
                {
                    var GastosTotales = (from v in contexto.Gasto.Include("CategoriaGasto")
                                         where v.FechaPago.Month == numeroMes &&
                                               v.FechaPago.Year == año &&
                                               v.Eliminado != true
                                         select v).ToList();

                    foreach (var item in GastosTotales)
                    {
                        InformeGastos gasto = new InformeGastos(item.CategoriaGasto.NombreCategoriaGasto, item.Importe);
                        ListaGastos.Add(gasto);
                    }

                    return ListaGastos;
                }
                else
                {
                    return ListaGastos;
                }
            }
            else
            {

                List<InformeGastos> ListaGastos = new List<InformeGastos>();

                var ExistenGastos = (from v in contexto.Gasto
                                     where v.FechaPago.Year == año &&
                                           v.Eliminado != true
                                     select v).Any();

                if (ExistenGastos)
                {
                    var IdCategorias = (from v in contexto.Gasto.Include("CategoriaGasto")
                                         where v.FechaPago.Year == año &&
                                               v.Eliminado != true
                                         select v.CategoriaGasto.IdCategoriaGasto).Distinct();

                    foreach (var item in IdCategorias)
                    {
                        var MontoTotal = (from v in contexto.Gasto.Include("CategoriaGasto")
                                            where v.FechaPago.Year == año &&
                                                  v.CategoriaGasto.IdCategoriaGasto == item &&
                                                  v.Eliminado != true
                                            select v.Importe).Sum();

                        CategoriaGasto cat = new CategoriaGastoAdapter().ObtenerEntidad(item);

                        InformeGastos gasto = new InformeGastos(cat.NombreCategoriaGasto, MontoTotal);
                        ListaGastos.Add(gasto);
                    }

                    return ListaGastos;
                }
                else
                {
                    return ListaGastos;
                }



            }

        }







        internal int ObtenerNumeroMes(string mes)
        {

            switch (mes)
            {

                case "Enero":
                    return 1;

                case "Febrero":
                    return 2;

                case "Marzo":
                    return 3;

                case "Abril":
                    return 4;

                case "Mayo":
                    return 5;

                case "Junio":
                    return 6;

                case "Julio":
                    return 7;

                case "Agosto":
                    return 8;

                case "Septiembre":
                    return 9;

                case "Octubre":
                    return 10;

                case "Noviembre":
                    return 11;

                case "Diciembre":
                    return 12;

                default: return 0;

            }


        }





    }
}
